package cn.hqc.org.service.impl;


import cn.hqc.basic.service.impl.BaseServiceImpl;
import cn.hqc.org.domain.Department;
import cn.hqc.org.service.DepartmentService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
@Slf4j
public class DepartmentServiceImpl extends BaseServiceImpl<Department> implements DepartmentService {


    /**
     * 简单写法 low逼写法
     * @return
     */
//    @Override
//    public List<Department> tree() {
//        List<Department> result = new ArrayList<>();
//        // 1.先把所有的数据查询出来
//        List<Department> allDepts = this.findAll();
//        // 2.对数据进行整理
//        for (Department dept : allDepts) {
//            if (null == dept.getParentId()){
//                // parentId为空 那么当前的这个dept 是顶级父类
//                result.add(dept);
//            }else {
//                // 这个dept 是儿子 它有爹 一个儿子只有一个爹！
//                Long parentId = dept.getParentId(); // 获取到当前儿子的父亲id
//                for (Department parent : allDepts) { // 再去遍历一次原始的集合
//                    if (parentId.equals(parent.getId())){
//                        // 这个时候 parent就是当前的dept的父亲
////                        List<Department> children = parent.getChildren();
////                        if (CollectionUtils.isEmpty(children)){
////                            children = new ArrayList<>();
////                        }
////                        children.add(dept);
//                        parent.getChildren().add(dept);
//                        break;
//                    }
//                }
//            }
//        }
//        return result;
//    }

    /**
     * 高级技师玩法
     *
     * @return
     */
    @Override
//    @Cacheable(cacheNames = "dept", key = "'tree'") // cachenames:缓存名称 key:redis的key
    // 最终放到redis中 的key 为：dept::tree --- value
    public List<Department> tree() {
        log.info("==========进入到方法了============");
        List<Department> result = new ArrayList<>();
        // 1.先把所有的数据查询出来
        List<Department> allDepts = this.findAll();
        // 将allDepts转成 deptMap 的key：对象的id  value：dept对象
        Map<Long, Department> deptMap = allDepts.stream().collect(Collectors.toMap(Department::getId, dept -> dept));
        // 相当于
//        Map<Long, Department> deptMap = new HashMap<>();
//        for (Department dept : allDepts) {
//            deptMap.put(dept.getId(),dept);
//        }
        // 2.对数据进行整理
        for (Department dept : allDepts) {
            if (null == dept.getParentId()) {
                // parentId为空 那么当前的这个dept 是顶级父类
                result.add(dept);
            } else {
                // 这个dept 是儿子 它有爹 一个儿子只有一个爹！
                Long parentId = dept.getParentId(); // 获取到当前儿子的父亲id
                // 根据 我儿子的父类id 找它的父类 儿子的parentId = 父类的id
                Department parent = deptMap.get(parentId);
                parent.getChildren().add(dept);
            }
        }
        return result;
    }

    @Override
    @CacheEvict(cacheNames = "dept", key = "'tree'")
    public void update(Department department) {
        super.update(department);
    }
}
